/*
 * @description: createStore 主要是根据传入的reducer，创建一个store对象，这个对象能给我们提供，获取state的方法(getState)，修改state的方法(dispatch)，监听修改的方法(subscribe)
 */
export default function createStore(reducer, enhancer) {
  let currentState; // 当前的 store
  let currentListeners = []; // 事件收集

  if (enhancer) {
    // 有 enhancer 就加强 dispatch
    return enhancer(createStore)(reducer);
  }

  // 获取当前的 store
  function getState() {
    return currentState;
  }

  // 派发
  function dispatch(action) {
    // 先修改 store
    currentState = reducer(currentState, action);

    // 触发订阅
    currentListeners.forEach((listener) => listener());
  }

  // 订阅
  function subscribe(listener) {
    currentListeners.push(listener);
    // 返回取消订阅
    return () => {
      const i = currentListeners.indexOf(listener);
      currentListeners.splice(i, 1);
    };
  }

  // 初始化一下
  dispatch({ type: '随机字符串....' });

  // 一个mini redux
  return {
    // createStore 返回的对象需要有下面的三个方法
    getState,
    dispatch,
    subscribe,
  };
}
